using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using TMPro;
using Unity.Mathematics;
using Unity.VisualScripting;
using UnityEditor;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UnityEngine.UIElements;

public class Player : MonoBehaviour {

    public Rigidbody rb;
    public Cenario cenario;
    public Camera cam;
    public List<GameObject> armadilhaGO, bolhasGO, portais;
    public int vida = 1, pontuacao = 0, time;
    public float valorZ, velocidade;
    public TextMeshProUGUI pontos, timer, vidaUI;

    // Inicialzia antes de começar o jogo
    void Start() {

        cenario = GameObject.Find("Cenario").GetComponent<Cenario>(); // Procura o Objeto cenario

        cam = FindAnyObjectByType<Camera>(); // Procura a camera presente na cena
        cam.gameObject.transform.SetParent(transform, false); // Define a camera como filha do personagem

        bolhasGO = cenario.bolhasGO; // Define as bolhas presentes cenario
        armadilhaGO = cenario.armadilhaGO; // Define as armadilhas presentes cenario

        // Cria uma Lista e Procura os 4 portais presentes no cenario
        for (int i = 0; i < 4; i++) {
            portais.Add(GameObject.Find("Portal " + Convert.ToString(i+1)));
        }
    }

    // Atualiza frame por frame
    void Update() {

        velocidade = pontuacao/50f + 0.1f;

        if (vida > 0)
        {
            time++; // Faz a contagem de tempo até que o jogador morra
            UnityEngine.Cursor.lockState = CursorLockMode.Locked;
        }
        else { UnityEngine.Cursor.lockState = CursorLockMode.None; }

        // Procura o Script "Cenario" no objeto cenario, caso ela não seja a tela final
        if (SceneManager.GetActiveScene() != SceneManager.GetSceneByName("Final")) {
            cenario = GameObject.Find("Cenario").GetComponent<Cenario>(); 
        }

        bolhasGO = cenario.bolhasGO; // Define as bolhas presentes cenario
        armadilhaGO = cenario.armadilhaGO; // Define as armadilhas presentes cenario

        // Procura os 4 portais presentes no cenario
        for (int i = 0; i < 4; i++) {
            portais[i] = GameObject.Find("Portal " + Convert.ToString(i + 1));
        }

        // Movimentação Automatica do Jogador
        transform.Translate(0,0,valorZ);
        valorZ = 1 * velocidade;
        
        // Movimentação para a Esquerda utilizando a Botão Esquerdo do Mouse
        if (Input.GetMouseButtonDown(0)) {
            transform.Rotate(0, -90, 0);
        }

        // Movimentação para a Esquerda utilizando a Botão Direito do Mouse
        else if (Input.GetMouseButtonDown(1)) {
            transform.Rotate(0, 90, 0);
            //transform.TransformDirection(transform.rotation.x, transform.rotation.y, transform.rotation.z);
        }

        // Redefine a direção que o Jogador ira
        transform.TransformDirection(transform.rotation.x, transform.rotation.y, transform.rotation.z);
    }
    
    // Define a morte do personagem
    private void Vida() {
        if (vida <= 0) {
            SceneManager.LoadScene("Final", LoadSceneMode.Single);
            DontDestroyOnLoad(gameObject);
            Destroy(GameObject.Find("Canvas"));
        }
    }

    
    private void OnCollisionEnter(Collision collision) {
        // Caso o jogador colida com as armadilhas
        for (int i = 0; i < armadilhaGO.Count; i++) {
            if (collision.gameObject == armadilhaGO[i]) {
                vida--;
                Vida();
                collision.transform.position = Vector3.zero;
            }
        }
    }

    
    private void OnTriggerEnter(Collider other) {

        // Caso o jogador colida com as bolhas
        for (int i = 0; i < bolhasGO.Count; i++) {
            if (other.gameObject == bolhasGO[i]) {
                pontuacao++;
                other.GetComponentInChildren<AudioSource>().Play();
                Destroy(other.gameObject);
            }
        }

        // Caso o jogador colida com os portões 
        for (int p = 0;p < portais.Count;p++) {
            if (other.gameObject == portais[p]) {
                int sceneChoice = UnityEngine.Random.Range(1, 5);
                switch (sceneChoice) {
                    case 1:
                        SceneManager.LoadScene("Agua");
                        break;
                    case 2:
                        SceneManager.LoadScene("Terra");
                        break;
                    case 3:
                        SceneManager.LoadScene("Ar");
                        break;
                    case 4:
                        SceneManager.LoadScene("Vazio");
                        break;
                    case 5:
                        SceneManager.LoadScene("Fogo");
                        break;
                }
                DontDestroyOnLoad(gameObject);
                DontDestroyOnLoad(GameObject.Find("Canvas"));
                transform.Translate(0, 0, -20);
                transform.Rotate(0,180,0);
            }
        }
    }

    // Informa a quantidade de pontos e vida na tela
    private void OnGUI() {
        pontos.text = "Pontuação: " + Convert.ToString(pontuacao);
        vidaUI.text = "Vida: " + Convert.ToString(vida);
        timer.text = Convert.ToString(time/1000);
    }
}